(function () {
    "use strict";

    angular.module('core').controller('conferenciaMovimentoLojaController', controller);
    controller.$inject = ['$scope', '$filter', '$timeout', '$alert', 'toolsService', 'vendaVarejoService', 'lookupService', '$q'];

    function controller($scope, $filter, $timeout, $alert, toolsService, vendaVarejoService, lookupService, $q) {
        $scope.initializeLayout('Movimento das Lojas');

        $scope.state = {
            filtro: { ativo: false, args: null, },
            filtroTicket: { data: { IndicaFinanceiroGerado: false, VendaVarejo: { Status: 1 } } },
            filtroDe: { data: { Emissao: null } },
            filtroAte: { data: { Emissao: null } },
            popUps: {
                alterarVenda: {
                    ativo: false
                }
            },
            passos: {
                enum: { selecao: 0, preparaFinanceiro: 1, preparaConferencia: 2, filtroTicket: 3, listaTickets: 4, resultado: 5 },
                corrente: 0,
                count: 6,
            },
            operacao: {
                selecionada: 0,
                enum: { conferencia: 0, financeiro: 1, filtroTicket: 2 },
            },
            vendas: [],
            vendaAtiva: {}
        };

        $scope.getVenda = function (id) {

            var item = { id: id }
            vendaVarejoService
                .get(item).then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                            console.error(response.Exception);
                        } else {
                            $scope.state.vendaAtiva = response.Data;
                        }

                    },
                    function (_error) {

                        $scope.state.carregando = false;
                        $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                        console.error(_error);
                    }
                );
        };
        $scope.save = function () {
            var sumValorPago = 0;

            if ($scope.state.vendaAtiva.Pagamentos.length > 0)
                for (var i = 0; i < $scope.state.vendaAtiva.Pagamentos.length; i++) {
                    sumValorPago += parseFloat($scope.state.vendaAtiva.Pagamentos[i].Valor);
                    $scope.state.vendaAtiva.Pagamentos[i].Valor = parseFloat($scope.state.vendaAtiva.Pagamentos[i].Valor);

                    if (!([3, 4, 9, 10].indexOf($scope.state.vendaAtiva.Pagamentos[i].Tipo) < 0)) {
                        if (!$scope.state.vendaAtiva.Pagamentos[i].Cartao.BandeiraCartao.Nome) {
                            $scope.tools.toastr.error('Pagamentos devem possuir bandeira!');
                            return;
                        }
                        if (!$scope.state.vendaAtiva.Pagamentos[i].Cartao.Autorizacao) {
                            $scope.tools.toastr.error('Pagamentos devem possuir autorizacao!');
                            return;
                        }
                        if (!$scope.state.vendaAtiva.Pagamentos[i].Cartao.Numero) {
                            $scope.tools.toastr.error('Pagamentos devem possuir numero de cartao!');
                            return;
                        }
                    }
                    if (!$scope.state.vendaAtiva.Pagamentos[i].Vencimento) {
                        $scope.tools.toastr.error('Pagamentos devem possuir vencimento!');
                        return;
                    }
                }

            if (sumValorPago != $scope.state.vendaAtiva.ValorPago) {
                $scope.tools.toastr.error('Valor total dos pagamentos nao batem com o valor pago!');
                return;
            }
            vendaVarejoService
                .save($scope.state.vendaAtiva).then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                            console.error(response.Exception);
                        } else {
                            $scope.state.vendaAtiva = null;
                            $scope.toggleAlterarVenda();
                        }

                    },
                    function (_error) {

                        $scope.state.carregando = false;
                        $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                        console.error(_error);
                    }
                );
        };

        $scope.toggleAlterarVenda = function (id) {

            if (!$scope.state.popUps.alterarVenda.ativo)
                $scope.getVenda(id);
            $scope.state.popUps.alterarVenda.ativo = !$scope.state.popUps.alterarVenda.ativo;
        }
        $scope.auxiliar = {
            TiposPgto: [
                { codigo: 0, nome: "Dinheiro" },
                { codigo: 1, nome: "Cheque à vista" },
                { codigo: 2, nome: "Cheque pré-datado" },
                { codigo: 3, nome: "Cartão de Crédito" },
                { codigo: 4, nome: "Cartão de Débito" },
                { codigo: 5, nome: "Boleto" },
                { codigo: 6, nome: "Vale Presente" },
                { codigo: 7, nome: "Crediário" },
                { codigo: 8, nome: "Brinde" },
                { codigo: 9, nome: "Cartão de Crédito TEF" },
                { codigo: 10, nome: "Cartão de Débito TEF" },
                { codigo: 99, nome: "Outros" }
            ],
            filial: {
                lookup: function (chaves) {

                    return $q.when(
                        lookupService
                            .getAllFilial({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            vendedor: {
                lookup: function (chaves) {

                    return $q.when(
                        lookupService
                            .getAllVendedor({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            BandeiraCartao: {
                lookup: function (chaves) {

                    return $q.when(
                        lookupService
                            .getAllBandeiraCartao({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            conferenciaMovimento: {
                data: [],
                get: function () {
                    $scope.auxiliar.conferenciaMovimento.carregando = true;
                    $scope.auxiliar.conferenciaMovimento.vazio = true;
                    vendaVarejoService
                        .groupAllConferenciaMovimento({})
                        .then(
                            function (response) {
                                if (response.Status < 0) {
                                    $alert({ title: $scope.Title, text: response.Message });
                                } else {
                                    angular.copy(angular.fromJson(response.Data), $scope.auxiliar.conferenciaMovimento.data);
                                }
                                $scope.auxiliar.conferenciaMovimento.carregando = false;
                                $scope.auxiliar.conferenciaMovimento.vazio = (!response.Data || response.Data.length == 0);
                            },
                            function (_error) {
                                $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                                $scope.auxiliar.conferenciaMovimento.carregando = false;
                            });
                },
            }
        };
        $scope.newPagamento = function () {
            vendaVarejoService.prepareNewPagamento({ venda: $scope.state.vendaAtiva }).then(
                function (response) {
                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        angular.copy(angular.fromJson(response.Data), $scope.state.vendaAtiva);
                    }
                },
                function (_error) {
                    $scope.state.carregando = false;
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');

                }
            );
        }
        $scope.getAllVendas = function () {

            //if (!$scope.state.filtroTicket.data.VendaVarejo.Filial.Empresa.ID)
            //{
            //    $scope.state.filtroTicket.data.VendaVarejo.Filial.Empresa = null;
            //}

            if ($scope.state.filtroTicket.data.VendaVarejo.Vendedor) {
                if ($scope.state.filtroTicket.data.VendaVarejo.Vendedor.Contato)
                    if (!$scope.state.filtroTicket.data.VendaVarejo.Vendedor.Contato.ID)
                        $scope.state.filtroTicket.data.VendaVarejo.Vendedor.Contato = null;
            }

            var args = { filtro: $scope.state.filtroTicket.data, filtroDe: $scope.state.filtroDe.data, filtroAte: $scope.state.filtroAte.data, sortExpression: "", skip: 0, take: 1000 }
            vendaVarejoService
                .getAllPagamento(args)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                            console.error(response.Exception);
                        } else {
                            angular.copy(angular.fromJson(response.Data), $scope.state.vendas);
                        }
                    },
                    function (_error) {
                        $scope.state.carregando = false;
                        $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');

                    }
                );
        };



        /* funções */
        $scope.next = function () {

            if ($scope.state.passos.corrente == $scope.state.passos.enum.selecao) {
                if ($scope.state.operacao.selecionada == $scope.state.operacao.enum.conferencia) {
                    $scope.state.passos.corrente = $scope.state.passos.enum.preparaConferencia;
                    $scope.auxiliar.conferenciaMovimento.get();
                    return;
                }
                if ($scope.state.operacao.selecionada == $scope.state.operacao.enum.filtroTicket) {
                    $scope.state.passos.corrente = $scope.state.passos.enum.filtroTicket;
                    //$scope.auxiliar.conferenciaMovimento.get();
                    return;
                }
            }
            else if ($scope.state.passos.corrente == $scope.state.passos.enum.preparaFinanceiro) {
                $scope.generateFinanceiro();
                return;
            }
            else if ($scope.state.passos.corrente == $scope.state.passos.enum.preparaConferencia) {
                if ($scope.state.operacao.selecionada == $scope.state.operacao.enum.conferencia) {
                    $scope.state.passos.corrente = $scope.state.passos.enum.preparaFinanceiro;
                    return;
                }
            }
            else if ($scope.state.passos.corrente == $scope.state.passos.enum.filtroTicket) {

                $scope.state.passos.corrente = $scope.state.passos.enum.listaTickets;
                $scope.getAllVendas();
                return;
            }
            $scope.state.passos.corrente++;
        };
        $scope.prior = function () {
            if ($scope.state.passos.corrente == $scope.state.passos.enum.preparaFinanceiro) {
                $scope.state.passos.corrente = $scope.state.passos.enum.selecao;
                return;
            }
            else if ($scope.state.passos.corrente == $scope.state.passos.enum.preparaConferencia) {
                $scope.state.passos.corrente = $scope.state.passos.enum.selecao;
                return;
            } else if ($scope.state.passos.corrente == $scope.state.passos.enum.filtroTicket) {
                $scope.state.passos.corrente = $scope.state.passos.enum.selecao;
                return;
            }



            $scope.state.passos.corrente--;
        };

        $scope.generateFinanceiroParcial = function (args) {
            $scope.state.carregando = true;
            vendaVarejoService
                .generateFinanceiro(args)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $alert({ title: $scope.Title, text: response.Message });
                        } else {
                            angular.copy(angular.fromJson(response.Data), $scope.state.data);
                            $scope.state.passos.corrente = $scope.state.passos.enum.resultado;
                        }
                        $scope.state.carregando = false;
                    },
                    function (_error) {
                        $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    });
        };

        $scope.generateFinanceiro = function () {
            if ($scope.state.operacao.selecionada === $scope.state.operacao.enum.conferencia) {
                $scope.auxiliar.conferenciaMovimento.data.forEach(function (item, index) {
                    if (item.IndicaConferido) {
                        var args = {
                            filtro: {
                                VendaVarejo: {
                                    Filial: { Empresa: { ID: item.FilialID } },
                                    Emissao: item.Emissao
                                },
                                Tipo: item.Tipo
                            }
                        };
                        $scope.generateFinanceiroParcial(args);
                    }
                });
            } else if ($scope.state.operacao.selecionada === $scope.state.operacao.enum.financeiro) {
                $scope.generateFinanceiroParcial({});
            } else {
                $alert({ title: $scope.Title, text: 'Operação selecionada não é válida.' });
            }
        };

        $scope.initialize();

    }

})();